package example.com.dynamicproxy;

import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.tencent.bugly.beta.Beta;
import com.tencent.bugly.beta.interfaces.BetaPatchListener;

import java.util.Locale;

import example.com.dynamicproxy.AMSHook.AMSHookUtil;


/**
 * 知识点：
 * 1. Activity的启动流程：startActivity--->ActvityManagerService--->ActivityManagerNative<---transact/onTransact----->真正的AMS进程
 * 2.ActivityThread启动，NaiveStart.main()-->ZygoteInit.main-->ZygoteInit$MethodAndArgsCall.run
 *                       -->Method.Invoke-->method.invokeNative-->ActivityThread.main()-->Looper.loop()
 * 3.java动态代理：
 * 4.应用程序包管理者PackageManager:http://blog.csdn.net/qinjuning/article/details/6867806
 *
 * 思路：
 * 1)反射修改PackageManager
 * 2)没有注册的Activity，能否直接调用mInstance启动activty;
 * 3)启动Activity和ActivityThreadHandle有什么关系呢？--->深入Activity的启动流程
 * 4)是否每个APP有自己的framework?--->android启动过程
 * 5）Activity生命周期方法的调用 ?--->
 *
 * zygote进程:Android系统的首个Java进程,专用于孵化Android框架层和应用层程序的进程,是所有Java进程的父进程，
 *           包括 system_server进程以及所有的App进程都是Zygote的子进程，注意这里说的是子进程，而非子线程。
 * system_server进程:也是由Zygote孵化而来的一个进程；该进程里运行了很多binder service,例如AMS,PMS,WMS,这些binder service分别运行在不同的线程中
 * 被启动的应用进程(dalvik应用进程):
 *
 * system_server进程：是用于管理整个Java framework层，包含ActivityManager，PowerManager等各种系统服务;是用于管理整个Java framework层

 */
//http://www.jianshu.com/p/2ad105f54d07
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button start = (Button) findViewById(R.id.start);

        AMSHookUtil.hookStartActivity(this);

        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, OtherActivity.class);
        //       Intent intent = new Intent(MainActivity.this, UnregisterAcitivity.class);
                startActivity(intent);
            }
        });

        findViewById(R.id.normalStart).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this,NormalLaunchActivity.class);
                startActivity(intent);
            }
        });

        findViewById(R.id.btnShowToast).setOnClickListener(this);
        findViewById(R.id.btnLoadPatch).setOnClickListener(this);
        findViewById(R.id.btnDownloadPatch).setOnClickListener(this);
        findViewById(R.id.btnPatchDownloaded).setOnClickListener(this);
        findViewById(R.id.btnCheckUpgrade).setOnClickListener(this);
        findViewById(R.id.btnPatchRollback).setOnClickListener(this);
        findViewById(R.id.btnKillSelf).setOnClickListener(this);

    }
    /**
     * 根据应用patch包前后来测试是否应用patch包成功.
     *
     * 应用patch包前，提示"This is a bug class"
     * 应用patch包之后，提示"The bug has fixed"
     */
    private void testToast() {
        Toast.makeText(getApplication(), LoadBugClass.getBugString(), Toast.LENGTH_SHORT).show();
    }



    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btnShowToast:  // 测试热更新功能
                testToast();
                break;

            case R.id.btnLoadPatch: // 本地加载补丁测试
                Beta.applyTinkerPatch(getApplicationContext(), Environment.getExternalStorageDirectory().getAbsolutePath() + "/patch_signed_7zip.apk");
                break;
            /*
            case R.id.btnLoadLibrary: // 本地加载so库测试
                TestJNI testJNI = new TestJNI();
                testJNI.createANativeCrash();
                break;
                */
            case R.id.btnDownloadPatch:
                Beta.downloadPatch();
                break;
            case R.id.btnPatchDownloaded:
                Beta.applyDownloadedPatch();
                break;
            case R.id.btnCheckUpgrade:
                Beta.checkUpgrade();
                break;

            case R.id.btnPatchRollback: //清除补丁
                Beta.cleanTinkerPatch();
                break;

            case R.id.btnKillSelf: // 杀死进程
                android.os.Process.killProcess(android.os.Process.myPid());
        }
    }


}
